package top.wangjiu.java.jvm.accessflag;

import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

/**
 * ACC_PUBLIC	0x0001	可以被包的类外访问。
 * ACC_FINAL	0x0010	不允许有子类。
 * ACC_SUPER	0x0020	当用到 invokespecial 指令时，需要特殊处理的父类方法。
 * ACC_INTERFACE	0x0200	标识定义的是接口而不是类。
 * ACC_ABSTRACT	0x0400	不能被实例化。
 * ACC_SYNTHETIC	0x1000	标识并非 Java 源码生成的代码。
 * ACC_ANNOTATION	0x2000	标识注解类型
 * ACC_ENUM	    0x4000	标识枚举类型
 *
 */
public enum ClassAccessFlag{

    ACC_PUBLIC(1),
    ACC_FINAL(1<<4),
    ACC_SUPER(2<<4),
    ACC_INTERFACE(2<<8),
    ACC_ABSTRACT(4<<8),
    ACC_SYNTHETIC(1<<12),
    ACC_ANNOTATION(2<<12),
    ACC_ENUM(4<<12),
    ;

    @Getter
    private final short flag;

    ClassAccessFlag(int flag){
        this.flag = (short) flag;
    }

    public static ClassAccessFlag[] parseAccessFlags(short accessFlags){
        List<ClassAccessFlag> list = new ArrayList<>();
        for (ClassAccessFlag value : ClassAccessFlag.values()) {
            if((value.flag & accessFlags) == value.flag){
                list.add(value);
            }
        }
        return list.toArray(new ClassAccessFlag[list.size()]);
    }



    @Override
    public String toString() {
        return this.name();
    }
}
